package org.jeecgframework.web.service;

import org.jeecgframework.core.common.model.json.AjaxJson;
import org.jeecgframework.core.common.model.json.DataGrid;
import org.jeecgframework.web.system.pojo.base.CbsEquipmentApplyEntity;
import org.jeecgframework.web.system.pojo.base.CbsServiceEntity;
import org.jeecgframework.core.common.service.CommonService;
import org.jeecgframework.web.system.pojo.base.TSUser;
import org.jeecgframework.web.system.pojo.base.ZyFileLogEntity;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface CbsServiceServiceI extends CommonService {

    <T> void delete(T entity);

    <T> Serializable save(T entity);

    <T> void saveOrUpdate(T entity);

    /**
     * 默认按钮-sql增强-新增操作
     *
     * @param
     * @return
     */
    boolean doAddSql(CbsServiceEntity t);

    /**
     * 默认按钮-sql增强-更新操作
     *
     * @param
     * @return
     */
    boolean doUpdateSql(CbsServiceEntity t);

    /**
     * 默认按钮-sql增强-删除操作
     *
     * @param
     * @return
     */
    boolean doDelSql(CbsServiceEntity t);

    /**
     * 创建服务单发送短信通知
     *
     * @param mobilePhone
     * @return
     */
    AjaxJson sendSMSOfCbsService(String mobilePhone, String htmlText);

    /**
     * 服务单信息导出
     *
     * @param request
     * @param response
     */
    void exportInspectionPlan(HttpServletRequest request, HttpServletResponse response);

    /**
     * 商务导出
     *
     * @param request
     * @param response
     */
    void exportInspectionAssignList(HttpServletRequest request, HttpServletResponse response);

    /**
     * 获取服务单号
     *
     * @return
     */
    Map getNo();

    /**
     * 获取子单服务单单号
     *
     * @return
     */
    Map getSublistNo(String parentNo);

    /**
     * 接单
     *
     * @param parentNo
     * @return
     */
    void updateCbsOrderTiem(String planIds, String engineerOrderTime);

    /**
     * 查找有区域工程师下的工程师
     *
     * @param userId  用户id
     * @param orgCode 组织code
     * @return
     */
    List<Map<String, Object>> findEngineerByUserId(String userId, String orgCode);

    /**
     * 查找没有区域工程师下的第三方工程师
     *
     * @param state
     * @param orgCode
     * @return
     */
    List<Map<String, Object>> findEngineerByOrgCodeAndRoleCode(String state, String orgCode);

    /**
     * 根据用户id获取用户所属组织
     *
     * @param userId 用户id
     * @return
     */
    List<Map<String, Object>> getUserOrgCode(String userId);

    /**
     * 获取设备服务单记录
     *
     * @param sn
     * @return
     */
    List<Map<String, Object>> getAllService(String sn);

    /**
     * 获取设备相关历史服务单三个月记录
     *
     * @param sn
     * @return
     */
    List<Map<String, Object>> getAllServiceBySn(String sn);

    /**
     * 获取影院相关历史三个月记录
     *
     * @param sn
     * @return
     */
    List<Map<String, Object>> getCinemaList(String sn);


    /**
     * 获取三个月巡检历史
     *
     * @param sn
     * @return
     */
    List<Map<String, Object>> getAllPlanBySn(String sn);


    /**
     * 根据服务单id查询编辑页面所需信息
     *
     * @param cid
     * @return
     */
    List<Map<String, Object>> getCbsServiceByCid(String cid);

    /**
     * 根据sn获取SLA信息
     *
     * @param cid
     * @return
     */
    List<Map<String, Object>> getAllSLABySn(String cid);

    /**
     * 根据服务类型id获取服务类型名称
     *
     * @param serviceId
     * @return
     */
    String getServiceTypeName(String serviceId);

    /**
     * 根据sn获取设备或者服务器信息
     *
     * @param sn
     * @return
     */
    List<Map<String, Object>> getgetProjector(String sn);

    /**
     * 根据sn获取影院信息
     *
     * @param sn
     * @return
     */
    List<Map<String, Object>> getCinemaBySn(String sn);

    /**
     * 判断编辑的单子是否是投诉子单，且父单是否是投诉子单，且除本单外是否父类下还有投诉子单
     *
     * @param ServiceId 服务单id
     */
    public boolean getServiceTypeNameByServiceId(String ServiceId);


    /**
     * 根据服务单id获取派单的工程师，以及派单要求和服务商处理时间
     *
     * @param cbsId 服务单id
     * @return
     */
    public List<Map<String, Object>> getContactsById(String cbsId);

    /**
     * 获取APP端维修列表数据
     * @param styletype
     * @param type
     * @param area
     * @param planYear
     * @param planMonth
     * @param esSn
     * @param cmId
     * @param counters 当前第几页
     * @param pageSize 每页显示条数
     * @return
     */
    public Map<String, Object> queryAppIpTpList(String TodoNum,String styletype, int type, String area, String planYear, String planMonth, String esSn, String cmId,int counters,int pageSize);

    /**
     * 获取APP端维修列表数据
     *
     * @param type
     * @param area
     * @param planYear
     * @param planMonth
     * @param esSn
     * @param cmId
     * @return
     */
    public Map<String, Object> queryAppIpTpAegList(String TodoNum,String styletype, int type, String area, String planYear, String planMonth, String esSn, String cmId);

    /**
     * 获取APP端维修列表数据
     *
     * @param type
     * @param area
     * @param planYear
     * @param planMonth
     * @param esSn
     * @param cmId
     * @return
     */
    public Map<String, Object> queryAppIpTpEgList(String TodoNum,String styletype, int type, String area, String planYear, String planMonth, String esSn, String cmId);

    /**
     * @param request
     * @param roleCode 页面选择的巡检单位值
     * @return
     * @author xiul
     * 2016-4-11 下午4:44:30
     * Description 根据rolecode获取第三方商务 datagrid
     */
    public void queryDatagridResultForChooseContacters(HttpServletRequest request, DataGrid dataGrid, String roleCode);


    /**
     * @param request
     * @param dataGrid
     * @param orgCode
     * @param planIds
     * @return
     * @author xiul
     * 2016-4-11 下午4:50:21
     * Description 区域工程师
     */
    public void queryDatagridResultForChooseEngineers(HttpServletRequest request, DataGrid dataGrid, String orgCode, String planIds);

    /**
     * @param request
     * @param dataGrid
     * @param orgCode
     * @param planIds
     * @return
     * @author xiul
     * 2016-4-11 下午4:50:21
     * Description 工程师
     */
    public void queryDatagridResultForChooseEgEnter(HttpServletRequest request, DataGrid dataGrid, String orgCode, String planIds);

    /**
     * 获取服务单信息
     *
     * @param cid
     * @return
     */
    List<Map<String, Object>> getCbsAPPServiceByCid(String cid);

    /**
     * APP查询商务或者区域工程师
     *
     * @param id 服务单id
     * @return
     */
    public List<Map<String, Object>> queryEngineerForAppEngName(String id);

    /**
     * 获取工程师未完成任务的数量
     *
     * @param id 服务单id
     * @return
     */
    public List<Map<String, Object>> queryEngineerWsizeForAppEngName(String id);

    /**
     * 序列号验证
     *
     * @param cbsId 服务单id
     * @param s_ns  故障序列号
     * @return
     */
    boolean snValiDate(String cbsId, String[] s_ns);

    /**
     * 序列号验证
     *
     * @param cbsId 服务单id
     * @param s_ns  故障序列号
     * @return
     */
    boolean snValiDateApp(String cbsId, String[] s_ns);

    /**
     * 参数不存在时，传null
     * 存入故障备件
     *
     * @param type_ids          备件类型id
     * @param type_dess         备件类型名称
     * @param item_ids          备件号id
     * @param itemms            备件号名称
     * @param s_ns              故障备件序列号
     * @param equipment_ercodes 二维码
     * @param user              当前登录人
     */
    void addFaultEquipment(String[] type_ids, String[] type_dess, String[] item_ids, String[] itemms, String[] s_ns, String[] equipment_ercodes, TSUser user);


    /**
     * 第三方上午 or 工程师 or 区域工程师 查询服务单代办数量
     *
     * @return
     */
    public Map queryAppAegOrEgTodoIps(String TodoNum);

    /**
     * 检查设备类型，服务器，type返回Y
     *
     * @param sn
     * @return
     */
    public List<Map<String, Object>> dontService(String sn);

    //显示当前生效的SLA信息，并且指向SLA增项后的信息标签后，弹框显示所有SLA的标准项列表。
    public List<Map<String, Object>> getSLABySn(String sn);

    /**
     * 根据影院名称获取影院id
     *
     * @param name
     * @return
     */
    public List<Map<String, Object>> getZyCinemaByName(String name);

    /**
     * 根据设备sn查找设备详情
     *
     * @param sn
     * @return
     */
    public List<Map<String, Object>> getZyEquipmentBySn(String sn);

    /**
     * 每天0点执行：完工单的完工日期后超过48小时未提交返件
     */
    public void unCommittedReturn();

    /**
     * 两小时未审批自动通过
     * @param cbsId
     * @return
     */
    /*void updateSpareStatus(String id,String realName);*/

    /**
     * 根据服务单id生成二维码，并根据条件回显
     *
     * @param cbsId 服务单id
     * @return 二维码文件路径
     */
    public ZyFileLogEntity getAppServiceQrCode(String cbsId);


    /**
     * 获取维修服务单，所有的年份
     *
     * @return
     */
    public List<String> queryYearsInService();


    /**
     * 院线服务情况报表 - 列表数据
     *
     * @param mold        类型 （1：咨询数量  2：上门服务数量 3：远程服务数量）
     * @param year        年份
     * @param intheaterId 院线
     * @param bp          BP
     * @return
     */
    public Map<String, List<Map<String, Integer>>> getIpProblemReportData(String mold, String year, String intheaterId, String bp);


    /**
     * 院线服务状态 - 列表数据
     *
     * @param intheaterId 院线
     * @param bp          BP
     * @return
     */
    public Map<String, Object> getStatusTableData(String intheaterId, String bp);


    /**
     * 设备整体维保情况
     *
     * @param cdateBegin    开始月份时间
     * @param cdateEnd      结束月份时间
     * @param intheatername 院线
     * @param bp            BP
     * @return
     */
    public Map<String, List<Map<String, Object>>>  getFacilitiesZtTableData(String cdateBegin, String cdateEnd, String intheatername, String bp);


    /**
     * 出保设备情况
     *
     * @param cdateBegin    开始月份时间
     * @param cdateEnd      结束月份时间
     * @param intheatername 院线
     * @param bp            BP
     * @return
     */
    public Map<String, List<Map<String, Object>>> getFacilitiesCbTableData(String cdateBegin, String cdateEnd, String intheatername, String bp);

    /**
     * 院线机型配比
     *
     * @param cdateBegin    开始月份时间
     * @param cdateEnd      结束月份时间
     * @param intheatername 院线
     * @param bp            BP
     * @return
     */
    public Map<String, String> getEsHighChartsOfCbData(String cdateBegin, String cdateEnd, String intheatername, String bp);

    /**
     * 内部转派 更改责任人
     */
    public AjaxJson changePerson(HttpServletRequest request);

    /**
     * 关单
     * @param request
     * @param response
     * @return
     */
    public AjaxJson closeServiceList(HttpServletRequest request, HttpServletResponse response);

    /**
     * @Author X On 2018/9/26 17:16
     * @Description 检查是否可以编辑完工单
     * @params 完工单id
     */
    AjaxJson checkForEditServiceReport(String serviceId);
}
